/* 
 * File:   EstruturaDinamica.h
 * Author: caio
 *
 * Created on 14 de Junho de 2012, 17:19
 */

#ifndef ESTRUTURADINAMICA_H
#define	ESTRUTURADINAMICA_H

#include <stdio.h>
#include <stdlib.h>
#include "Processo.h"

#ifdef	__cplusplus
extern "C" {
#endif   

struct no {
    Processo* processo;
    struct no* prox;
    struct no* ant;
};

typedef struct no Lista;

//estrutura que agrupa os ponteiros para inicio e fim
struct ed {
    Lista* ini;
    Lista* fim;
    int tamanho;
};

typedef struct ed Estrutura;

/**
 * Funcao que inicializa a estrutura de uma lista
 * @return ponteiro da estrutura com inicio e fim da lista
 */
Estrutura* ed_nova();

/**
 * Funcao que insere um elemento no inicio da lista
 * @param ponteiro para estrutura *f
 * @param processo
 * @return void
 */
void ed_insere_inicio(Estrutura *f, Processo *processo);

/**
 * Funcao que insere um elemento no fim da lista
 * @param ponteiro para estrutura *f
 * @param processo
 * @return void
 */
void
ed_insere_fim(Estrutura *f, Processo *processo);

/**
 * Desloca o elemento do inicio para o fim da estrutura
 *  - ini aponta para o proximo
 *  - fim aponta para o processo que acabou de sai do inicio
 * @param lista *f
 * @return void
 */
void ed_fifo(Estrutura *f);

/**
 * Funcao que verifica se a lista eh vazia
 * @param ponteiro para Estrutura
 * @return inteiro 1 erro ou 0 sucesso
 */
int ed_vazia(Estrutura *f);

/**
 * Imprime o conteudo da lista
 * @param ponteiro para Estrutura
 */
void ed_imprime(Estrutura* f);

/**
 * Funcao que remove todos os nos e estrutura da lista
 * @param estrutura e
 * @return void
 */
Estrutura* ed_free(Estrutura *e);

/**
 * Funcao que remove o primeiro elemento da Estrutura
 * @param Estrutura f
 * @return Processo removido
 */
Processo* ed_remove_inicio(Estrutura *f, Processo *p);

/**
 * Funcao que remove o último elemento da Estrutura
 * @param Estrutura ed
 * @return Processo removido
 */
Processo* ed_remove_fim(Estrutura *ed, Processo *p);

/**
 * Funcao que retorna um processo correspondente ao pid passado como parâmetro
 * @param Estrutura ed
 * @param int pid
 * @return Processo correspondente ao pid
 */
Processo* ed_encontra_processo_por_pid(Estrutura *ed, int pid);

/**
 * Funcao que retorna um nó de acordo com o pid passado como parâmetro
 * @param Estrutura f
 * @param int pid 
 * @return retorna elemento no
 */
Lista* ed_encontra_no_por_pid(Estrutura *ed, int pid);

/**
 * Funcao que remove um processo em qualquer posição da estrutura
 * @param Estrutura ed
 * @param Processo processo
 * @return Processo removido
 */
Processo* ed_remove_meio(Estrutura* ed, Processo *processo);

/**
 * Funcao que reposiciona um nó na 1ª posição da estrutura
 * @param Estrutura ed
 * @param Lista no
 */
void ed_altera_posicao_first(Estrutura* ed, Lista* no);

#ifdef	__cplusplus
}
#endif

#endif	/* ESTRUTURADINAMICA_H */

